/**
 * @file CoupledBoundaryCarbonBasedAblationMaterial.h
 * @brief 计算气动加热条件下的碳基材料烧蚀,基于双平台模型
 * @author 刘骁
 * @date 2020.03
 * @version 0.001
 * @copyright liuxiao
 *
 */
#pragma once

#include "Material.h"
#include "MaterialData.h"
#include "LinearInterpolation.h"

class Function;
/**
 * @class CoupledBoundaryCarbonBasedAblationMaterial
 * @brief 耦合边界下的碳基材料烧蚀
 *
 * 基于双平台模型模型计算热化学烧蚀量,从外部给定热环境参数
 * @author liu
 * @date 2020.03
 * @version 0.001
 * @copyright liu
 */
class CoupledBoundaryCarbonBasedAblationMaterial : public Material
{
public:
	CoupledBoundaryCarbonBasedAblationMaterial(const InputParameters & parameters);
protected:


	/**
	 * @name 壁面组分分压
	 *
	 * 壁面各组分的分压,单位为atm
	 */
	MaterialProperty<Real> & _Pw_C1;
	MaterialProperty<Real> & _Pw_C2;
	MaterialProperty<Real> & _Pw_C3;
	MaterialProperty<Real> & _Pw_C4;
	MaterialProperty<Real> & _Pw_C5;
	MaterialProperty<Real> & _Pw_O2;
	MaterialProperty<Real> & _Pw_O;
	MaterialProperty<Real> & _Pw_CO;
	MaterialProperty<Real> & _Pw_CO2;
	MaterialProperty<Real> & _Pw_N2;
	MaterialProperty<Real> & _Pw_N;
	MaterialProperty<Real> & _Pw_CN;
	MaterialProperty<Real> & _Pw_C2N;
	/** @} */
	/**
	 * @name 壁面组分质量浓度
	 *
	 * 壁面各组分的质量浓度,单位为1
	 */
	MaterialProperty<Real> & _Cw_C1;
	MaterialProperty<Real> & _Cw_C2;
	MaterialProperty<Real> & _Cw_C3;
	MaterialProperty<Real> & _Cw_C4;
	MaterialProperty<Real> & _Cw_C5;
	MaterialProperty<Real> & _Cw_O2;
	MaterialProperty<Real> & _Cw_O;
	MaterialProperty<Real> & _Cw_CO;
	MaterialProperty<Real> & _Cw_CO2;
	MaterialProperty<Real> & _Cw_N2;
	MaterialProperty<Real> & _Cw_N;
	MaterialProperty<Real> & _Cw_CN;
	MaterialProperty<Real> & _Cw_C2N;
	/** @} */
	/**
	 * @name 平均摩尔质量
	 *
	 * 壁面参与反应气态混合物平均摩尔质量,单位kg/mol
	 */
	MaterialProperty<Real> & _M_bar;
	/** @} */
	/**
	 * @name 无量纲质量损失系数
	 */
	MaterialProperty<Real> & _Bc;
	MaterialProperty<Real> & _Bp;
	MaterialProperty<Real> & _Bw;
	/** @} */
	/**
	 * @name 烧蚀参数
	 *
	 * 计算获得的烧蚀相关参数
	 */
	MaterialProperty<Real> & _mc;/**<单位面积碳的质量损失速率,单位kg/s/m^2 */
	MaterialProperty<Real> & _recession_rate;/**<表面法向的线烧蚀速率,单位m/s */
	MaterialProperty<Real> & _mw;/**<壁面单位面积总的材料质量损失速率,单位kg/s/m^2 */
	MaterialProperty<Real> & _injection_coff;/**<质量引射系数,反应质量引射对热流的阻塞效应,单位1 */
	/** @} */

	/**
	 * @name 计算烧蚀外部输入参数
	 *
	 * 边界层外缘的流场参数和材料物性参数,部分从气动热软件及材料热响应模块计算结果中获得,部分由用户给定
	 *
	 * @note 注意单位
	 */
	const MaterialProperty<Real> & _hr;/**<恢复焓,单位J */
	const MaterialProperty<Real> & _Pe_atm;/**<边界层外缘压力,单位atm */
	const MaterialProperty<Real> & _Pe_O2;/**<边界层外缘氧气分压,单位atm */
	const MaterialProperty<Real> & _Pe_N2;/**<边界层外缘氮气分压,单位atm */
	const MaterialProperty<Real> & _M_e;/**<边界层外缘气体摩尔质量,单位kg/mol */
	const ADMaterialProperty<Real> & _Rhos;/**<固体材料密度,单位kg/m^3 */
	const MaterialProperty<Real> & _qc_0K;/**<壁面温度为0K时的冷壁热流,单位w/m^2 */
	/** @} */
	/**
	 * @name 热解气体相关参数
	 *
	 * 目前没有用,后面跟热解型材料热响应耦合计算时会用到
	 */
	Real  _M_p;
	Real  _mp;
	/** @} */
	const VariableValue & _Tw;/**<耦合的壁面温度,由结构温度场计算获得,单位K */
	int  _gamma;/**<湍流标记,=0层流,=1湍流,目前湍流收敛性有问题 */
	int _scala_model;/**<碳氧化的scala模型选择,=0慢反应,=1快反应,默认快反应 */
	Real _bw_res;
	/**
	 * @name 化学平衡常数,
	 *
	 * 各个反应的压力平衡常数
	 */
	Real  _Kp_C1;
	Real  _Kp_C2;
	Real  _Kp_C3;
	Real  _Kp_C4;
	Real  _Kp_C5;
	Real  _Kp_O;
	Real  _Kp_CO2;
	Real  _Kp_CN;
	Real  _Kp_C2N;
	Real  _Kp_N;
	/** @} */
	/**
	 * @name 摩尔质量
	 *
	 * 各个壁面组分的摩尔质量,单位kg/mol
	 */
	Real  _M_C;
	Real  _M_C1;
	Real  _M_C2;
	Real  _M_C3;
	Real  _M_C4;
	Real  _M_C5;
	Real  _M_O2;
	Real  _M_O;
	Real  _M_CO;
	Real  _M_CO2;
	Real  _M_N2;
	Real  _M_N;
	Real  _M_CN;
	Real  _M_C2N;
	/** @} */
	Real _R;/**<通用气体常数,8.314	J/kg/K */
	/**
	 * @brief 计算化学平衡常数
	 *
	 * @param T 温度,单位K
	 */
	void compute_Kp(Real T);
	/**
	 * @brief 计算质量浓度
	 *
	 * 在给定组分分压的情况下计算其质量浓度
	 *
	 * @param P 分压,单位atm
	 * @param Mi 组分i的摩尔质量,单位kg/mol
	 * @param M_bar 混合物平均摩尔质量,单位kg/mol
	 * @param qp 高斯积分点编号
	 * @retval C_i 组分i的质量浓度
	 */
	Real compute_Ci_from_P(Real P,Real Mi,Real M_bar,int qp);
	/**
	 * @brief 计算碳蒸气分压
	 *
	 * 计算碳升华后的碳蒸气分压
	 *
	 * @param i i=1,2,3,4,5,碳蒸气碳分子数
	 * @param Bw 壁面无量纲质量损失系数
	 * @param phi 质量引射系数
	 * @param M_bar 混合物平均摩尔质量,单位kg/mol
	 * @param T 壁面温度,单位K
	 * @param qp 高斯积分点编号
	 * @retval P_Ci 碳蒸气Ci的分压,单位atm
	 */
	Real compute_P_Ci(int i,Real Bw,Real phi,Real M_bar,Real T,int qp);
	/**
	 * @brief 计算壁面氧气分压
	 *
	 * 计算壁面的氧气(O2)分压
	 *
	 * @param Pw_CO 壁面CO分压,单位atm
	 * @param Pw_CO2 壁面CO2分压,单位atm
	 * @param Pw_O 壁面氧原子(O)分压,单位atm
	 * @param Bw 壁面无量纲质量损失系数
	 * @param phi 质量引射系数
	 * @param M_bar 混合物平均摩尔质量,单位kg/mol
	 * @param T 壁面温度,单位K
	 * @param qp 高斯积分点编号
	 * @return 壁面的O2分压
	 */
	Real compute_Pw_O2(Real Pw_CO,Real Pw_CO2,Real Pw_O,Real Bw,Real phi,Real M_bar,Real T,int qp);
	/**
	 * @brief 计算壁面原子氧分压
	 *
	 * 计算壁面的氧原子(O)分压
	 * @retval Pw_O 壁面的O分压
	 */
	Real compute_Pw_O(Real Pw_O2);
	/**
	 * @brief 计算壁面一氧化碳分压
	 *
	 * 计算壁面的一氧化碳气体(CO)分压
	 *
	 * @param Pw_O2 壁面O2分压,单位atm
	 * @param Pw_O 壁面氧原子分压,单位atm
	 * @param M_bar 混合物平均摩尔质量,单位kg/mol
	 * @param Bw 壁面无量纲质量损失系数
	 * @param qp 高斯积分点编号
	 * @retval Pw_CO 壁面一氧化碳气体(CO)分压,单位atm
	 */
	Real compute_Pw_CO(Real Pw_O2,Real Pw_O,Real M_bar,Real Bw,int qp);
	/**
	 * @brief 计算壁面二氧化碳分压
	 *
	 * 计算壁面的二氧化碳气体(CO2)分压
	 *
	 * @param Pw_CO 壁面CO分压,单位atm
	 * @param Pw_O2 壁面O2分压,单位atm
	 * @retval Pw_CO2 壁面二氧化碳气体(CO2)分压,单位atm
	 */
	Real compute_Pw_CO2(Real Pw_CO,Real Pw_O2);
	/**
	 * @brief 计算壁面氮气分压
	 *
	 * 计算壁面的氮气(N2)分压
	 *
	 * @param phi 质量引射系数
	 * @param M_bar 混合物平均摩尔质量,单位kg/mol
	 * @param Bw 壁面无量纲质量损失系数
	 * @param qp 高斯积分点编号
	 * @retval Pw_N2 壁面氮气(N2)分压,单位atm
	 */
	Real compute_Pw_N2(Real Bw,Real phi,Real M_bar,int qp);
	/**
	 * @brief 计算壁面N原子分压
	 *
	 * @param Pw_N2 壁面N2分压,单位atm
	 * @retval Pw_N 壁面N原子分压,单位atm
	 */
	Real compute_Pw_N(Real Pw_N2);
	/**
	 * @brief 计算壁面CN分压
	 *
	 * @param Pw_N2 壁面N2分压,单位atm
	 * @retval Pw_CN 壁面CN分压,单位atm
	 */
	Real compute_Pw_CN(Real Pw_N2);
	/**
		 * @brief 计算壁面C2N分压
		 *
		 * @param Pw_N2 壁面N2分压,单位atm
		 * @retval Pw_CN 壁面C2N分压,单位atm
		 */
	Real compute_Pw_C2N(Real Pw_N2);
	/**
	 * @brief 计算壁面混合物平均摩尔质量
	 *
	 * 输入各个组分质量浓度,得到混合物的平均摩尔质量
	 * @retval M_bar 壁面混合物平均摩尔质量,单位atm
	 */
	Real compute_M_bar(Real Cw_C1,Real Cw_C2,Real Cw_C3,Real Cw_C4,Real Cw_C5,Real Cw_O2,Real Cw_O,Real Cw_CO,Real Cw_CO2,Real Cw_N2,Real Cw_N,Real Cw_CN,Real Cw_C2N);
	/**
		 * @brief 计算壁面碳元素的当量质量浓度
		 *
		 * 计算壁面碳(C)元素的当量质量浓度
		 *
		 * @param Cw_C1 壁面C1气体质量浓度
		 * @param Cw_C2 壁面C3气体质量浓度
		 * @param Cw_C3 壁面C3气体质量浓度
		 * @param Cw_C4 壁面C4气体质量浓度
		 * @param Cw_C5 壁面C5气体质量浓度
		 * @param Cw_CO 壁面CO气体质量浓度
		 * @param Cw_CO2 壁面CO2气体质量浓度
		 * @param Cw_CN  壁面CN气体质量浓度
		 * @retval carbon_w 壁面碳元素当量质量浓度
		 */
	Real compute_carbon_w(Real Cw_C1,Real Cw_C2,Real Cw_C3,Real Cw_C4,Real Cw_C5,Real Cw_CO,Real Cw_CO2,Real Cw_CN,Real Cw_C2N);
	/**
	 * @brief 计算碳元素无量纲质量损失系数
	 *
	 * @param carbon_w 壁面碳元素当量质量浓度
	 * @param Bp 热解气体无量纲质量损失系数
	 * @retval Bc 碳元素质量损失系数
	 */
	Real compute_Bc(Real carbon_w,Real Bp);
	/**
	 * @brief 计算热解气体无量纲质量损失系数
	 *
	 * @param mp 壁面热解气体质量流率,单位kg/s/m^2
	 * @param phi 壁面质量引射系数
	 * @param qp 高斯积分点编号
	 * @retval Bc 碳元素质量损失系数
	 */
	Real compute_Bp(Real mp,Real phi,int qp);
	/**
	 * @brief 计算碳元素质量损失速率
	 *
	 * @param Bc 碳元素无量纲质量损失系数
	 * @param phi 壁面质量引射系数
	 * @param qp 高斯积分点编号
	 * @retval mc 碳元素质量损失速率,kg/s/m^2
	 */
	Real compute_mc(Real Bc,Real phi,int qp);
	/**
		 * @brief 计算壁面质量引射系数
		 *
		 * @param Bc 碳元素无量纲质量损失系数
		 * @param M_bar 混合物平均摩尔质量,单位kg/mol
		 * @param mc 碳元素质量损失速率,kg/s/m^2
		 * @param qp 高斯积分点编号
		 * @param mp 壁面热解气体质量流率,单位kg/s/m^2
		 * @param gamma 湍流判别因子,=0层流,=1湍流
		 * @param T 壁面温度,单位K
		 * @param qp 高斯积分点编号
		 * @note gamma=1时计算收敛性有问题,目前最好就取0,对结果影响不大
		 * @retval phi 质量引射系数
		 */
	Real compute_phi(Real Bc,Real M_bar,Real mc,Real mp,int gamma,Real T,int qp); 	/**
	 * @brief 迭代求解Bw,phi,M_bar,以及 Cw_i;
	 *
	 * @param T 壁面温度,单位K
	 * @param qp 高斯积分点编号
	 * @retval mc 碳元素质量损失速率,kg/s/m^2
	 */
	void iteration(Real T,int qp);
	virtual void computeProperties();



};

template<>
InputParameters validParams<CoupledBoundaryCarbonBasedAblationMaterial>();




